package com.luxsoft.siipap.em.replica.importadores.ventas;

import java.math.BigDecimal;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.Predicate;
import org.springframework.util.Assert;

import com.luxsoft.siipap.em.replica.importadores.ImportadorSupport;
import com.luxsoft.siipap.em.replica.model.Registro;
import com.luxsoft.siipap.em.replica.online.RegistroMapper;
import com.luxsoft.siipap.model.CantidadMonetaria;
import com.luxsoft.siipap.model.Sucursal;
import com.luxsoft.siipap.model.core.Producto;
import com.luxsoft.siipap.service.ServiceLocator2;
import com.luxsoft.siipap.ventas.model.VentaDet;

public class VentasDetRegistroMapper implements RegistroMapper<VentaDet>{

	@SuppressWarnings("unused")
	public VentaDet mapRegistro(Registro rs) throws RuntimeException {
		VentaDet det=new VentaDet();
		//Extraemos los posibles campos
		Number ALMSUCUR=rs.getNumber("ALMSUCUR");
		String ALMTIPO=rs.getString("ALMTIPO");
		Number ALMNUMER=rs.getNumber("ALMNUMER");
		Number ALMRENGL=(Number)rs.getDouble("ALMRENGL");
		Date ALMFECHA=rs.getDate("ALMFECHA");
		String ALMARTIC=rs.getString("ALMARTIC");
		String ALMNOMBR=rs.getString("ALMNOMBR");
		Number ALMKILOS=(Number)rs.getDouble("ALMKILOS");
		Number ALMCANTI=(Number)rs.getDouble("ALMCANTI");
		String ALMSERIE=rs.getString("ALMSERIE");
		String ALMTIPFA=rs.getString("ALMTIPFA");
		BigDecimal ALMPRECI=rs.getBigDecimal("ALMPRECI");
		BigDecimal ALMPREFA=rs.getBigDecimal("ALMPREFA");
		Number ALMPREFAI=(Number)rs.getDouble("ALMPREFAI");
		String ALMTIPIVA=rs.getString("ALMTIPIVA");
		String ALMOBSER=rs.getString("ALMOBSER");
		Date ALMFECH2=rs.getDate("ALMFECH2");
		Number ALMCANT2=(Number)rs.getDouble("ALMCANT2");
		Number ALMSUCODE=(Number)rs.getDouble("ALMSUCODE");
		Number ALMNUCORE=(Number)rs.getDouble("ALMNUCORE");
		Number ALMCOSTO=(Number)rs.getDouble("ALMCOSTO");
		Number ALMPRECPR=(Number)rs.getDouble("ALMPRECPR");
		String ALMNOMDES=rs.getString("ALMNOMDES");
		String ALMPORDES=rs.getString("ALMPORDES");
		String ALMNOMCAR=rs.getString("ALMNOMCAR");
		String ALMPORCAR=rs.getString("ALMPORCAR");
		String ALMUNIDMED=rs.getString("ALMUNIDMED");
		Number ALMUNIXUNI=(Number)rs.getDouble("ALMUNIXUNI");
		Number ALMDEVANFA=(Number)rs.getDouble("ALMDEVANFA");
		Number ALMSALENFA=(Number)rs.getDouble("ALMSALENFA");
		Number ALMRENGLFA=(Number)rs.getDouble("ALMRENGLFA");
		String ALMHORA=rs.getString("ALMHORA");
		Number ALMSEGS=(Number)rs.getDouble("ALMSEGS");
		String ALMUSUAR=rs.getString("ALMUSUAR");
		Number ALMGRUPOIM=(Number)rs.getDouble("ALMGRUPOIM");
		Number ALMSUCCXC=(Number)rs.getDouble("ALMSUCCXC");
		Number ALMIDECXC=(Number)rs.getDouble("ALMIDECXC");
		String ALMSERCXC=rs.getString("ALMSERCXC");
		String ALMTIPCXC=rs.getString("ALMTIPCXC");
		Number ALMNUMCXC=(Number)rs.getDouble("ALMNUMCXC");
		Date ALMFECCXC=rs.getDate("ALMFECCXC");
		Date ALMFEREAL=rs.getDate("ALMFEREAL");
		Number ALMGRAMS=(Number)rs.getDouble("ALMGRAMS");
		Number ALMPREKIL=(Number)rs.getDouble("ALMPREKIL");
		
		Producto p=ImportadorSupport.getInstance().buscarProducto(ALMARTIC);
		Assert.notNull(p,"No se puede importar la partidad de venta si el articulo: "+ALMARTIC+ " no existe en la base de datos");
		det.setProducto(p);
		det.setCantidad(ALMCANTI.doubleValue());
		det.setFactor(ALMUNIXUNI.doubleValue());
		det.setDocumento(ALMNUMER.longValue());
		det.setFecha(ALMFECHA);
		det.setComentario(ALMOBSER);
		det.setPrecioLista(ALMPRECI);
		det.setPrecio(ALMPREFA);
		det.setTipo(ALMTIPFA);
		det.setSerie(ALMSERIE);
		
		Sucursal suc=buscarSucursal(ALMSUCUR.intValue());
		Assert.notNull(suc,"No existe la sucursal: "+ALMSUCUR);		
		det.setSucursal(suc);
		CantidadMonetaria precio=CantidadMonetaria.pesos(det.getPrecio().doubleValue());
		precio=precio.abs();
		double canti=det.getCantidad()/det.getFactor();
		det.setImporte(precio.multiply(canti).amount());
		det.setRenglon(ALMRENGL.intValue());
		det.setCreateUser("REPLICA_ADMIN");
		det.setUpdateUser("REPLICA_ADMIN");
		
		return det;
	}
	
	private Set<Sucursal> sucursales=new HashSet<Sucursal>();
	
	public  Sucursal buscarSucursal(final int clave){
		if(sucursales.isEmpty()){
			sucursales.addAll(ServiceLocator2.getLookupManager().getSucursales());
		}
		return (Sucursal) CollectionUtils.find(sucursales, new Predicate(){
			public boolean evaluate(Object input) {
				Sucursal p=(Sucursal)input;
				return p.getClave()==clave;
			}
		});
	}

}
